// pin_map.c
#include "pin_map.h"
#include "stm32f10x_tim.h"

/*
	PA13 和 PA14 是 SWD 接口必需引脚（最常用的调试方式）
	PA15、PB3、PB4 是 JTAG 接口引脚，但可通过重映射释放
	晶振引脚 PC14/PC15 通常不能用作普通 GPIO，除非你不用 HSE。
*/

// 定义 pin_map 表
const PinMap pin_map[] = {
    // ------------------------
    //        GPIOA
    // ------------------------
    [GPIO_PIN_PA0]  = { GPIOA, GPIO_Pin_0,  0, NULL,        0,           NULL },
    [GPIO_PIN_PA1]  = { GPIOA, GPIO_Pin_1,  0, NULL,        0,           NULL },
    [GPIO_PIN_PA2]  = { GPIOA, GPIO_Pin_2,  1, TIM2,        TIM_Channel_3, &TIM2->CCR3 },  // PA2: TIM2_CH3
    [GPIO_PIN_PA3]  = { GPIOA, GPIO_Pin_3,  1, TIM2,        TIM_Channel_4, &TIM2->CCR4 },  // PA3: TIM2_CH4
    [GPIO_PIN_PA4]  = { GPIOA, GPIO_Pin_4,  0, NULL,        0,           NULL },
    [GPIO_PIN_PA5]  = { GPIOA, GPIO_Pin_5,  0, NULL,        0,           NULL },
    [GPIO_PIN_PA6]  = { GPIOA, GPIO_Pin_6,  1, TIM3,        TIM_Channel_1, &TIM3->CCR1 },  // PA6: TIM3_CH1
    [GPIO_PIN_PA7]  = { GPIOA, GPIO_Pin_7,  1, TIM3,        TIM_Channel_2, &TIM3->CCR2 },  // PA7: TIM3_CH2
    [GPIO_PIN_PA8]  = { GPIOA, GPIO_Pin_8,  1, TIM1,        TIM_Channel_1, &TIM1->CCR1 },  // PA8: TIM1_CH1
    [GPIO_PIN_PA9]  = { GPIOA, GPIO_Pin_9,  1, TIM1,        TIM_Channel_2, &TIM1->CCR2 },  // PA9: TIM1_CH2
    [GPIO_PIN_PA10] = { GPIOA, GPIO_Pin_10, 1, TIM1,        TIM_Channel_3, &TIM1->CCR3 },  // PA10: TIM1_CH3
    [GPIO_PIN_PA11] = { GPIOA, GPIO_Pin_11, 0, NULL,        0,           NULL },  // USB/USART1
    [GPIO_PIN_PA12] = { GPIOA, GPIO_Pin_12, 0, NULL,        0,           NULL },  // USB/USART1
    [GPIO_PIN_PA13] = { GPIOA, GPIO_Pin_13, 0, NULL,        0,           NULL },  // SWDIO
    [GPIO_PIN_PA14] = { GPIOA, GPIO_Pin_14, 0, NULL,        0,           NULL },  // SWCLK
    [GPIO_PIN_PA15] = { GPIOA, GPIO_Pin_15, 1, TIM2,        TIM_Channel_1, &TIM2->CCR1 },  // PA15: TIM2_CH1 remap

    // ------------------------
    //        GPIOB
    // ------------------------
    [GPIO_PIN_PB0]  = { GPIOB, GPIO_Pin_0,  1, TIM3,        TIM_Channel_3, &TIM3->CCR3 },  // PB0: TIM3_CH3
    [GPIO_PIN_PB1]  = { GPIOB, GPIO_Pin_1,  1, TIM3,        TIM_Channel_4, &TIM3->CCR4 },  // PB1: TIM3_CH4
    [GPIO_PIN_PB2]  = { GPIOB, GPIO_Pin_2,  0, NULL,        0,           NULL },  // Boot1
    [GPIO_PIN_PB3]  = { GPIOB, GPIO_Pin_3,  1, TIM2,        TIM_Channel_2, &TIM2->CCR2 },  // PB3: TIM2_CH2 remap
    [GPIO_PIN_PB4]  = { GPIOB, GPIO_Pin_4,  0, NULL,        0,           NULL },  // JTAG_TRST
    [GPIO_PIN_PB5]  = { GPIOB, GPIO_Pin_5,  0, NULL,        0,           NULL },
    [GPIO_PIN_PB6]  = { GPIOB, GPIO_Pin_6,  1, TIM4,        TIM_Channel_1, &TIM4->CCR1 },  // PB6: TIM4_CH1
    [GPIO_PIN_PB7]  = { GPIOB, GPIO_Pin_7,  1, TIM4,        TIM_Channel_2, &TIM4->CCR2 },  // PB7: TIM4_CH2
    [GPIO_PIN_PB8]  = { GPIOB, GPIO_Pin_8,  1, TIM4,        TIM_Channel_3, &TIM4->CCR3 },  // PB8: TIM4_CH3
    [GPIO_PIN_PB9]  = { GPIOB, GPIO_Pin_9,  1, TIM4,        TIM_Channel_4, &TIM4->CCR4 },  // PB9: TIM4_CH4
    [GPIO_PIN_PB10] = { GPIOB, GPIO_Pin_10, 1, TIM2,        TIM_Channel_3, &TIM2->CCR3 },  // PB10: TIM2_CH3 remap
    [GPIO_PIN_PB11] = { GPIOB, GPIO_Pin_11, 1, TIM2,        TIM_Channel_4, &TIM2->CCR4 },  // PB11: TIM2_CH4 remap
    [GPIO_PIN_PB12] = { GPIOB, GPIO_Pin_12, 0, NULL,        0,           NULL },
    [GPIO_PIN_PB13] = { GPIOB, GPIO_Pin_13, 0, NULL,        0,           NULL },
    [GPIO_PIN_PB14] = { GPIOB, GPIO_Pin_14, 0, NULL,        0,           NULL },
    [GPIO_PIN_PB15] = { GPIOB, GPIO_Pin_15, 0, NULL,        0,           NULL },

    // ------------------------
    //        GPIOC
    // ------------------------
    [GPIO_PIN_PC0]  = { GPIOC, GPIO_Pin_0,  0, NULL,        0,           NULL },
    [GPIO_PIN_PC1]  = { GPIOC, GPIO_Pin_1,  0, NULL,        0,           NULL },
    [GPIO_PIN_PC2]  = { GPIOC, GPIO_Pin_2,  0, NULL,        0,           NULL },
    [GPIO_PIN_PC3]  = { GPIOC, GPIO_Pin_3,  0, NULL,        0,           NULL },
    [GPIO_PIN_PC4]  = { GPIOC, GPIO_Pin_4,  0, NULL,        0,           NULL },
    [GPIO_PIN_PC5]  = { GPIOC, GPIO_Pin_5,  0, NULL,        0,           NULL },
    [GPIO_PIN_PC6]  = { GPIOC, GPIO_Pin_6,  1, TIM8,        TIM_Channel_1, &TIM8->CCR1 },  // PC6: TIM8_CH1
    [GPIO_PIN_PC7]  = { GPIOC, GPIO_Pin_7,  1, TIM8,        TIM_Channel_2, &TIM8->CCR2 },  // PC7: TIM8_CH2
    [GPIO_PIN_PC8]  = { GPIOC, GPIO_Pin_8,  1, TIM8,        TIM_Channel_3, &TIM8->CCR3 },  // PC8: TIM8_CH3
    [GPIO_PIN_PC9]  = { GPIOC, GPIO_Pin_9,  1, TIM8,        TIM_Channel_4, &TIM8->CCR4 },  // PC9: TIM8_CH4
    [GPIO_PIN_PC10] = { GPIOC, GPIO_Pin_10, 0, NULL,        0,           NULL },
    [GPIO_PIN_PC11] = { GPIOC, GPIO_Pin_11, 0, NULL,        0,           NULL },
    [GPIO_PIN_PC12] = { GPIOC, GPIO_Pin_12, 0, NULL,        0,           NULL },
    [GPIO_PIN_PC13] = { GPIOC, GPIO_Pin_13, 0, NULL,        0,           NULL },  // 晶振
    [GPIO_PIN_PC14] = { GPIOC, GPIO_Pin_14, 0, NULL,        0,           NULL },  // 晶振
    [GPIO_PIN_PC15] = { GPIOC, GPIO_Pin_15, 0, NULL,        0,           NULL },  // 晶振

    // ------------------------
    //        GPIOD
    // ------------------------
    [GPIO_PIN_PD0]  = { GPIOD, GPIO_Pin_0,  0, NULL,        0,           NULL },  // FSMC
    [GPIO_PIN_PD1]  = { GPIOD, GPIO_Pin_1,  0, NULL,        0,           NULL },  // FSMC
    [GPIO_PIN_PD2]  = { GPIOD, GPIO_Pin_2,  0, NULL,        0,           NULL },  // 可用
    [GPIO_PIN_PD3]  = { GPIOD, GPIO_Pin_3,  0, NULL,        0,           NULL },
    [GPIO_PIN_PD4]  = { GPIOD, GPIO_Pin_4,  0, NULL,        0,           NULL },
    [GPIO_PIN_PD5]  = { GPIOD, GPIO_Pin_5,  0, NULL,        0,           NULL },
    [GPIO_PIN_PD6]  = { GPIOD, GPIO_Pin_6,  0, NULL,        0,           NULL },
    [GPIO_PIN_PD7]  = { GPIOD, GPIO_Pin_7,  0, NULL,        0,           NULL },
    [GPIO_PIN_PD8]  = { GPIOD, GPIO_Pin_8,  0, NULL,        0,           NULL },
    [GPIO_PIN_PD9]  = { GPIOD, GPIO_Pin_9,  0, NULL,        0,           NULL },
    [GPIO_PIN_PD10] = { GPIOD, GPIO_Pin_10, 0, NULL,        0,           NULL },
    [GPIO_PIN_PD11] = { GPIOD, GPIO_Pin_11, 0, NULL,        0,           NULL },
    [GPIO_PIN_PD12] = { GPIOD, GPIO_Pin_12, 1, TIM4,        TIM_Channel_1, &TIM4->CCR1 },  // PD12: TIM4_CH1 remap
    [GPIO_PIN_PD13] = { GPIOD, GPIO_Pin_13, 1, TIM4,        TIM_Channel_2, &TIM4->CCR2 },  // PD13: TIM4_CH2 remap
    [GPIO_PIN_PD14] = { GPIOD, GPIO_Pin_14, 1, TIM4,        TIM_Channel_3, &TIM4->CCR3 },  // PD14: TIM4_CH3 remap
    [GPIO_PIN_PD15] = { GPIOD, GPIO_Pin_15, 1, TIM4,        TIM_Channel_4, &TIM4->CCR4 },  // PD15: TIM4_CH4 remap
};

// 定义 PIN_COUNT（必须是 const int，不能是宏）
const int PIN_COUNT = sizeof(pin_map) / sizeof(pin_map[0]);

/**
 * @brief  释放调试引脚为普通 GPIO（保留 SWD，禁用 JTAG）
 * 
 * 作用：
 *   - PA15 → 可用作普通 GPIO
 *   - PB3  → 可用作普通 GPIO
 *   - PB4  → 可用作普通 GPIO
 *   - PA13 和 PA14 保持 SWD 功能（仍可下载程序）
 */
void gpio_init_debug_pins_as_gpio(void)
{
    // 使能 AFIO 时钟（必须）
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

    // 禁用 JTAG，保留 SWD
    // 即：PA15, PB3, PB4 变成普通 GPIO
    //     PA13, PA14 仍为 SWDIO/SWCLK
    GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);

    // 可选：如果你连 SWD 也不要了（完全禁用调试接口）
    // GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENABLE);
    // 警告：这样你就无法再通过 SWD 下载程序了！
}
